
import {take, put, delay, takeEvery, fork, call, cancel} from 'redux-saga/effects'

// all 监听saga的完成   类似于promise all
// cancel 取消任务

// takeEvery允许并发
// takeLatest不允许并发，dispatch 一个 `USER_FETCH_REQUESTED` action 时，
// 如果在这之前已经有一个 `USER_FETCH_REQUESTED` action 在处理中，
// 那么处理中的 action 会被取消，只会执行当前的
function test() {
  return new Promise((resolve) => {
    resolve('hha')
  })
}
function *workerSaga() {
  console.log('add1')
  yield delay(1000)
  let rs = yield call(test) //执行一个方法

  console.log('add2', rs)

  // 向仓库派发一个 action
  yield put({type: 'ADD1'})
}

// 让这边停止 内部是调用的 it.return() 结束
function *add() {
  while(true) {
    yield delay(1000)
    yield put({type: 'ADD1'})
  }
}

function *addWatcher() {
  const task = yield fork(add)
  yield take('STOP')
  yield cancel(task)
}

function *watcherSaga() {
  // 监听这个 会卡在这 暂停 
  // 如果有人派发了  就会执行 下面那个workersaga

  // take只会监听一次
  yield take('ASYNC_ADD')
  yield workerSaga()
}

function *rootSaga(){
  // console.log('roorSaga')  
  yield takeEvery('ASYNC_ADD2', workerSaga) // 监听每个动作 用到了 fork
  // console.log('也会执行把')
  // fork 开启一个新的任务   workerSaga会立刻单独执行  不会阻塞当前saga向下执行
  // yield fork(workerSaga) 
  // yield addWatcher()
  // console.log('rootsagaback')
  yield watcherSaga();
  console.log('借宿嘛')
}

export default rootSaga